/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Lugar;
import transervfx.Dato.Entidad.LugarTramiteFrecuente;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Logica.GestorLugar;
import transervfx.Logica.GestorPais;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.ComboBoxAutoCompletar;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class ABMLugarTramiteFrecuente extends VentanaModal {
    
  
    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta=1000;
   
    @FXML
    private ImageView iconoBuscando;

    @FXML
    private TextField calle;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField numero;   
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextField codigoPostal;
    @FXML
    private ComboBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBoxAutoCompletar<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
    
    @FXML
    private TableView<Lugar> tablaLugares;
    @FXML
    private TableColumn columCalle;
    @FXML
    private TableColumn columNumero;
    @FXML
    private TableColumn columDepartamento;
    @FXML
    private TableColumn columPiso;
    @FXML
    private TableColumn columCodigoPostal;
    @FXML
    private TableColumn columLocalidad;
    @FXML
    private TableColumn columProvincia;
    
     @FXML
    private Pagination paginador;
    private int itemPorPagina = 10;
    
    final ObservableList<Lugar> dataSourceLugar = FXCollections.observableArrayList();
    
   /* final ObservableList<Localidad> dataSourceLocalidad = FXCollections.observableArrayList();
    final ObservableList<Pais> dataSourcePais = FXCollections.observableArrayList();
    final ObservableList<Provincia> dataSourceProvincia = FXCollections.observableArrayList();*/
 
    
    public ABMLugarTramiteFrecuente(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        init();
    }
    
    public void init() {
        
        tablaLugares.setItems(dataSourceLugar);
        
        this.cargarPaicesProvinciasLocalidades();
            
        

        //seteo parametros del paginador
        paginador.setMaxPageIndicatorCount(5);
        int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1)  / itemPorPagina) + 1;
        paginador.setPageCount(nroDePaginas);
        
        //cada vez que selecciona un indice del paginador crea la pagina
        paginador.setPageFactory(new Callback<Integer, Node>() {
            @Override
            public Node call(Integer pageIndex) {
                return crearPagina(pageIndex);
            }
        });
   

        //introduce un Escuchador para cada Field del Filtro
        this.calle.textProperty().addListener(this.escuchadorInputTextField);
        this.numero.textProperty().addListener(this.escuchadorInputTextField);
        this.departamento.textProperty().addListener(this.escuchadorInputTextField);
        this.piso.textProperty().addListener(this.escuchadorInputTextField);
        this.localidad.valueProperty().addListener(this.escuchadorInputTextField);
        this.provincia.valueProperty().addListener(this.escuchadorInputTextField);
        this.pais.valueProperty().addListener(this.escuchadorInputTextField);


        //Hace un binding entre La columna y las propiedades del usuarioViedw
        columCalle.setCellValueFactory(
                new PropertyValueFactory<Lugar, String>("calle"));
        columNumero.setCellValueFactory(
                new PropertyValueFactory<Lugar, String>("numero"));
        columDepartamento.setCellValueFactory(
                new PropertyValueFactory<Lugar, String>("departamento"));
        columPiso.setCellValueFactory(
                new PropertyValueFactory<Lugar, String>("piso"));
        columLocalidad.setCellValueFactory(
                new PropertyValueFactory<Lugar, String>("localidad"));
         this.columProvincia.setCellValueFactory(
         new Callback<CellDataFeatures<Lugar, String>, ObservableValue<String>>() {
             @Override
         public ObservableValue<String> call(CellDataFeatures<Lugar, String> p) {
         // p.getValue() returns the Person instance for a particular TableView row
         return new SimpleStringProperty(p.getValue().getLocalidad().getProvincia().toString());
         }
         });
    //    System.out.println("texto "+this.nroDoc.getText()+"propertytext "+this.nroDoc.textProperty()+"propertynumber "+this.nroDoc.numberProperty()+" integer"+this.nroDoc.numberProperty().getValue());
    }

    

    private Node crearPagina(int pageIndex) {
       
        Integer nroA = (this.numero.textProperty().get().isEmpty()) ? null : this.numero.getNumber();
        Integer pisoA = (this.piso.textProperty().get().isEmpty()) ? null : this.piso.getNumber();
        String provA = (this.provincia.getSelectionModel().getSelectedItem() == null) ? "" : this.provincia.getSelectionModel().getSelectedItem().getNombre();
        String paisA = (this.pais.getSelectionModel().getSelectedItem() == null) ? "" : this.pais.getSelectionModel().getSelectedItem().getNombre();
        String locA = (this.localidad.getSelectionModel().getSelectedItem() == null) ? "" : this.localidad.getSelectionModel().getSelectedItem().getNombre();
        VBox box = new VBox(1);

        this.dataSourceLugar.clear();
        int page = pageIndex * itemPorPagina;
        this.dataSourceLugar.addAll(GestorLugar.getInstance().buscarLugarTramitePorFiltro(this.calle.getText(),nroA,this.departamento.getText(),pisoA,locA,provA,paisA, page, itemPorPagina));
        
        box.getChildren().add(this.tablaLugares);

        return box;
    }
    
    
    

    private void buscarLugaresPorFiltro(int ini, int nroElementos) {
     
        
        Integer nroA = (this.numero.textProperty().get().isEmpty()) ? null : this.numero.getNumber();
        Integer pisoA = (this.piso.textProperty().get().isEmpty()) ? null : this.piso.getNumber();
        String provA = (this.provincia.getSelectionModel().getSelectedItem() == null) ? "" : this.provincia.getSelectionModel().getSelectedItem().getNombre();
        String paisA = (this.pais.getSelectionModel().getSelectedItem() == null) ? "" : this.pais.getSelectionModel().getSelectedItem().getNombre();
        String locA = (this.localidad.getSelectionModel().getSelectedItem() == null) ? "" : this.localidad.getSelectionModel().getSelectedItem().getNombre();

        List<LugarTramiteFrecuente> lugaresFiltrados = GestorLugar.getInstance().buscarLugarTramitePorFiltro(this.calle.getText(),nroA,this.departamento.getText(),pisoA,locA,provA,paisA, ini, nroElementos);
        dataSourceLugar.clear();
        this.dataSourceLugar.addAll(lugaresFiltrados);
    }

    private Long numeroDePaginasPorFiltro() {
    
        Integer nroA = (this.numero.textProperty().get().isEmpty()) ? null : this.numero.getNumber();
        Integer pisoA = (this.piso.textProperty().get().isEmpty()) ? null : this.piso.getNumber();
       
        String provA = (this.provincia.getSelectionModel().getSelectedItem() == null) ? "" : this.provincia.getSelectionModel().getSelectedItem().getNombre();
        String paisA = (this.pais.getSelectionModel().getSelectedItem() == null) ? "" : this.pais.getSelectionModel().getSelectedItem().getNombre();
        String locA = (this.localidad.getSelectionModel().getSelectedItem() == null) ? "" : this.localidad.getSelectionModel().getSelectedItem().getNombre();
 
        return GestorLugar.getInstance().cantidadDeLugaresTramitesFiltrados(this.calle.getText(),nroA,this.departamento.getText(),pisoA,locA,provA,paisA);

    }
    
    public void buttonCancelar(ActionEvent event) {
        //System.out.println(((Button)event.getSource()).getText());
        this.close();
        //System.exit(1);
    }

    public void buttonNuevo() throws NoSuchMethodException, IOException {
      new CrearLugarTramiteFrecuente(this,"Crear Lugar Tramite Frecuente", 600, 320);
    }
    
    ChangeListener escuchadorInputTextField = new ChangeListener<Object>() {
        public void changed(
                ObservableValue observableValue,
                Object s, Object s1) {

            if(s1!=null){
            if (!s1.toString().isEmpty() || !s.toString().equals(s1)) {
                // delay location updates to we don't go too fast file typing

                iconoBuscando.setVisible(true);

                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            public void handle(ActionEvent actionEvent) {
                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                // items.removeAll(items);
                                int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
                                paginador.setPageCount(nroDePaginas);
                                
                                buscarLugaresPorFiltro(0, itemPorPagina);
                                iconoBuscando.setVisible(false);
                            }
                        }));
                locationUpdateTimeline.play();

            }
        }
        }
    };
    
    private void cargarPaicesProvinciasLocalidades() {
      
          
         pais.setItems(FXCollections.observableArrayList(GestorPais.getInstance().paises()));
            
            
         provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {

            @Override
            public void changed(ObservableValue<? extends Provincia> arg0, Provincia arg1, Provincia arg2) {
                if (arg2 != null) {
                     localidad.setData(GestorPais.getInstance().localidades(arg2));
                }
            }
        });
            
       
         pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {

            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                     provincia.setData(GestorPais.getInstance().provincias(arg2));
                }
            }
        });
         
         
        
        
    }
    
   
    public void actualizarTabla() {
        int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
        paginador.setPageCount(nroDePaginas);

        buscarLugaresPorFiltro(0, itemPorPagina);
    }
    
       @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("ABMLugarTramiteFrecFXML.fxml");
    }
       
       
       public void buttonElegir(){
           
       }
             
}
